const util = require('./utils/util.js');

App({
  globalData: {
    userInfo: {
      username: '',  // 用户昵称
      useravatar: '',  // 用户头像
    },
    userToken: null,  // 用户登录凭证
    requestUrl: 'http://localhost:3000/',  // 路径
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLaunch: function () {

    // 获取缓存的logs数组，插入当前时间戳，重存缓存
    const logs = wx.getStorageSync('logs') || [];
    logs.unshift(Date.now());
    wx.setStorageSync('logs', logs);

    // 从缓存中获取用户信息和Token，判断是否存在，进行相应逻辑
    let userInfo = wx.getStorageSync('userInfo');
    let userToken = wx.getStorageSync('userToken');
    if (!userToken) {
      this.userLogin();  
    } else {
      // 检测用户登录态是否有效
      wx.checkSession({
        success: () => {
          this.verifyToken(userToken);  
        },
        fail: () => {
          console.log('用户登录状态过期，重新登录');
          this.userLogin();  
        }
      });
    }
  },

/**
 * 使用微信登录接口获取登录凭证，然后发送请求到后端验证登录并获取用户信息。
 */
  userLogin() {
    // 登录接口获取登录凭证
    wx.login({ 
      success: res => {
        // 封装的网络请求函数
        util.request(this.globalData.requestUrl + 'login?code=' + res.code, 'GET')
          .then(res => {
            console.log('登录响应:', res);
            if (res.code === 200) {
              const userToken = res.data.token;
              this.setUserToken(userToken);  
              this.getUserInfoFromServer(userToken);  
            } else {
              console.error('登录失败:', res.msg);
            }
          })
          .catch(err => {
            console.error('登录请求失败', err);
          });
      },
      fail: err => {
        console.error('wx.login 调用失败', err);
      }
    });
  },

/**
 * 向后端发送验证token的请求，判断token是否有效，再做相应的逻辑
 * @param {string} token - 用户token
 */
  verifyToken(token) {
    // 获取UID
    util.request(this.globalData.requestUrl + 'GetUID', 'GET', null)
      .then(res => {
        if (res.valid) {
          this.globalData.userToken = token;
          this.getUserInfoFromServer(token);
        } else {
          console.log('Token无效，重新登录');
          this.userLogin();
        }
      })
      .catch(err => {
        console.error('验证Token请求失败', err);
      });
  },

 /**
 * 从后端获取获取用户昵称和头像信息，更新全局用户信息并存储到缓存。
 * @param {string} token - 用户token
 */
  getUserInfoFromServer(token) {
    // 获取更新昵称
    util.request(this.globalData.requestUrl + 'users/GetName', 'GET', null)
      .then(res => {
        this.setUserInfo(res.data, this.globalData.userInfo.useravatar);
        wx.setStorageSync('userInfo', {
          username: res.data,
          useravatar: this.globalData.userInfo.useravatar
        });
      })
      .catch(err => {
        console.error('获取用户昵称失败', err);
      });

    // 获取更新头像
    util.request(this.globalData.requestUrl + 'users/GetPhoto', 'GET', null)
      .then(res => {
        this.setUserInfo(this.globalData.userInfo.username, res.data);
        wx.setStorageSync('userInfo', {
          username: this.globalData.userInfo.username,
          useravatar: res.data
        });
      })
      .catch(err => {
        console.error('获取用户头像失败', err);
      });
  },

/**
 * 保存用户信息到全局变量和缓存
 * @param {Object} userInfo - 用户信息
 */
  saveUserInfo: function (userInfo) {
    this.globalData.userInfo = userInfo;
    wx.setStorageSync('userInfo', userInfo);
  },

/**
 * 设置用户信息的方法
 * @param {string} username - 用户名
 * @param {string} useravatar - 用户头像URL
 */
  setUserInfo: function (username, useravatar) {
    this.globalData.userInfo.username = username;
    this.globalData.userInfo.useravatar = useravatar;
  },


/**
 * 设置用户登录凭证的方法
 * @param {string} token - 用户登录凭证
 */
  setUserToken: function (token) {
    this.globalData.userToken = token;
    wx.setStorageSync('userToken', token); // 存储Token到缓存
  },

 /**
 * 获取用户信息的方法
 * @returns {Object} - 用户信息
 */
  getUserInfo: function () {
    return this.globalData.userInfo;
  },

/**
 * 获取用户登录凭证的方法
 * @returns {string} - 用户登录凭证
 */
  getUserToken: function () {
    return this.globalData.userToken;
  },

/**
 * 上传头像
 * @param {string} UserAvatar - 用户头像文件路径
 * @param {string} FileName - 自定义文件名
 * @returns {Promise<string>} - 返回一个 Promise，解析为上传后的头像URL
 */
  uploadImage(UserAvatar, FileName) {
    return new Promise((resolve, reject) => {
      // 上传图片到本地服务器
      wx.uploadFile({
        url: this.globalData.requestUrl + 'upload', 
        filePath: UserAvatar,
        name: 'TestShark', // 服务器定义的接收文件字段名称
        formData: {
          filename: FileName + "头像.jpeg" // 自定义文件名
        },
        header: {
          'Authorization': this.globalData.userToken
        },
        success: (res) => {
          try {
            const data = JSON.parse(res.data);
            const newAvatarUrl = data.data.FileURL;
            this.globalData.userInfo.useravatar = newAvatarUrl;
            console.log('新用户头像URL为：', newAvatarUrl);
            resolve(newAvatarUrl); 
          } catch (e) {
            console.error('后端返回的数据时出错：', e);
            reject(e); 
          }
        },
        fail: (err) => {
          console.error('上传图片失败：', err);
          reject(err); 
        }
      });
    });
  },
});